// 配置路由的地方
import Vue from 'vue'
import VueRouter from 'vue-router'
import routes from './routes'
import store from '@/store'
// 先将VueRouter原型对象的push，先保存一份
let originPush = VueRouter.prototype.push;

/* 重写push 与 replace方法
  第一个参数：告诉原来push方法往哪儿跳转，传那些参数
  第二个参数：成功回调
  第三个参数：失败回调
  call||apply区别：
    相同点：都可以调用函数一次，都可以篡改函数的上下文一次
    不同点：call与apply传递参数：call传递参数用逗号隔开，apply方法执行，传递参数 
*/
// 重写VueRouter.prototype身上的push方法
VueRouter.prototype.push = function(location,resolve,reject){
  if(resolve && reject){
    originPush.call(this,location, resolve, reject);
  }else{
    originPush.call(this,location,()=>{},()=>{})
  }
}
// 从写VueRouter.prototype身上的replace方法
VueRouter.prototype.replace = function(location,resolve,reject){
  if(resolve && reject){
    originPush.call(this,location, resolve, reject);
  }else{
    originPush.call(this,location,()=>{},()=>{})
  }
}

// 使用插件
Vue.use(VueRouter)

// 对外暴露VueRouter类的实例
let router = new VueRouter({
  // 配置路由
  // 路径的前面需要有 / ,路径中的单词都是小写
  routes,
  // 滚动行为
  scrollBehavior (to, from, savedPosition) {
    // 返回的y=0代表滚动条在最上方
    return {y:0}
  }
})

// 全局守卫：前置守卫(在路由跳转之前进行判断)
router.beforeEach(async (to, from, next)=>{
  // to:可以获取到跳转的路由信息
  // from:可以获取到跳转前所在路由信息
  // next:放行函数 next()放行  next('url')指定放行路由
  // 用户登录了才会有token，未登录一定不会有token
  let token = store.state.user.token
  // 用户信息
  let name = store.state.user.userInfo.name
  // 用户已经登录
  if(token){
    // 用户已经登录，不能再去login,停留在首页
    if(to.path == '/login'||to.path == '/register'){
      next('/')
    }else{
      // 登录，但是去的不是login
      // 如果用户名已经有了
      if(name){
        next()
      }else{
        // 没有用户信息,派发action让仓库存储用户信息再跳转
        try {
          // 获取用户信息成功
          await store.dispatch('getUserInfo')
          // 放行
          next();
        } catch (error) {
          // token失效了获取不到用户信息，需要重新登陆，清除token ,
          await store.dispatch('userLogout')
          next('/login');
        }
      }
    }
  }else{
    // 未登录不能去交易相关、支付相关、个人中心,未登录点击这几个页面跳转至登录页面
    let toPath = to.path
    if(toPath.indexOf('/trade') != -1 || toPath.indexOf('/pay') != -1 || toPath.indexOf('/center') != -1 ){
      // 把未登录时想去未去成的信息本地存储
      next('/login?redirect='+toPath)
    }else{
      // 其他区域可以进行放行
      next()
    }
  }
})

export default router